#pragma once
#include <iostream>
#include "InetAddr.hpp"
#include "Log.hpp"
#include "Protocol.hpp"
#include "Connection.hpp"
#include "NetCal.hpp"

using namespace log_ns;

class PackageParse
{
public:
    void Execute(Connection *conn)
    {
        // 长服务
        while (true)
        {

            //  2.报文解析，提取报文和有效载荷，报文就在inbuffer里
            std::string package = Decode(conn->Inbuffer());
            // 空字符串代表报文不完整，直接break
            if (package.empty())
                break; // 应该是break，再去响应
            // 反序列化做处理
            auto req = Factory::BuildRequestDefault();

            std::cout << "package: \n"
                      << package << std::endl;

            // 3.做反序列化
            req->Deserialize(package);

            // 4.业务处理
            auto resp = cal.Calculator(req);
            // 5.构建序列化应答
            std::string respjson;
            // 先序列化
            resp->Serialize(&respjson);
            std::cout << "respjson: \n"
                      << respjson << std::endl;

            // 6.添加len长度报头
            respjson = Encode(respjson);
            std::cout << "respjson add header done: \n"
                      << respjson << std::endl;

            // 7.发回
            conn->AppendOutbuffer(respjson); // 将结果追加到发送缓冲区内
        }

        // 我们已经至少处理了一个请求，同时至少会有一个应答
        // 当不为空的时候响应，为空就不响应
        if (!conn->Outbuffer().empty())
        {
            conn->_handler_sender(conn); // 方法1：直接发送数据
        }
    }

private:
    NetCal cal;
};